<?php

class Nomina_Mdl extends com\soka\SokaModel {
    const DIAS_ANIO = 360;

    private $_con;

    public function __construct() {
        parent::__construct();
        $this->_con = $this->useModel('concepto');
    }

    public function ultimaNomina() {
        try {
            $result = $this->_db->prepare("CALL sp_ultima_nomina()");
            $result->execute();
            while ($row = $result->fetch(\PDO::FETCH_ASSOC))
                $data[] = $row;
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
        }
        return $data;
    }

    public function getEmpleadoProyecto($proyecto = NULL) {
        try {
            $result = $this->_db->prepare("CALL sp_id_empleados_proyectos('{$proyecto}') ");
            $result->execute();
            while ($row = $result->fetch(\PDO::FETCH_ASSOC))
                $data[] = $row['id'];
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
        }
        return $data;
    }

    public function getNominaPago($id_nomina) {
        try {
            $result = $this->_db->prepare("CALL sp_pago_nomina_ver('{$id_nomina}')");
            $result->execute();
            while ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $data[] = $row;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $data;
    }

    public function uploadReport($id_nomina, $file) {
        try {
            $result = $this->_db->prepare("CALL sp_upload_backup_nomina('{$file}', '{$id_nomina}')");
            return $result->execute();
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $data;
    }

    public function getNominaEmpleado($fecha_pago, $nomina) {
        try {
            $result = $this->_db->prepare("CALL sp_nomina_empleado('{$fecha_pago}', '{$nomina}')");
            $result->execute();
            while ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $data[$row->primer_nombre . ',' . $row->numero_identidad] ['conceptos'] [$row->tipo_c . ':' . $row->concepto] = $row->valor_concepto;
                $data[$row->primer_nombre . ',' . $row->numero_identidad] ['salario'] = self::sueldo($row->id);
                //$data['parafiscal'] = self::viewparafiscales($nomina);
                $data[$row->primer_nombre . ',' . $row->numero_identidad] ['datosPersonales'] ['nombre'] = $row->primer_nombre;
                $data[$row->primer_nombre . ',' . $row->numero_identidad] ['datosPersonales'] ['apellido'] = $row->primer_apellido;
                $data[$row->primer_nombre . ',' . $row->numero_identidad] ['datosPersonales'] ['num_documento'] = $row->numero_identidad;
                $data[$row->primer_nombre . ',' . $row->numero_identidad] ['datosPersonales'] ['cargo'] = $row->cargo;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $data;
    }

    public function get() {
        try {
            $result = $this->_db->query("SELECT  n.fecha_inicio, n.fecha_fin, n.estado,  n.id,
												p.nombre FROM nomina n
										INNER JOIN proyecto p ON n.proyecto_id = p.id ");
            $result->execute();
            while ($row = $result->fetch(\PDO::FETCH_ASSOC)) {
                $data[] = $row;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
        }
        return $data;
    }

    public function verify($proyecto, $fi, $ff) {
        try {
            $result = $this->_db->query("SELECT  fecha_inicio, fecha_fin FROM nomina 
										 WHERE fecha_inicio ='$fi' AND fecha_fin ='$ff' AND proyecto_id = '$proyecto' ");
            $result->execute();
            if ($result->rowCount() > 0)
                return TRUE;
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
        }
    }
    
    
    protected function diasLaboradosNovedades(){
        try {
            $result = $this->_db->query("SELECT  * FROM falta  WHERE fecha ='$fi'  ");
            $result->execute();
            if ($result->rowCount() > 0)   
                return $result->fetch(\PDO::FETCH_ASSOC);
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
        }
    }

    /**
     * obtiene los dias laborados del empleado hasta la fcha actual
     * @author Dawin Ossa
     * @param int $trab_id empleado
     * @return int dias
     */
    public function diasTrabajados($trab_id, $fini, $ffin) {
        try {
            $result = $this->_db->prepare("CALL sp_dias_trabajados('{$trab_id}','{$fini}','{$ffin}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $dias = $row->dias;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $dias;
    }

    /**
     * obtiene el tipo de contrato del empleado
     * @param int $trab_id empleado
     * @author Dawin Ossa
     * @return String
     */
    public function tipoContrato($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_tipo_contrato('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $contrato = $row->nombre;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $contrato;
    }

    /**
     * obtiene el sueldo que gana un empleado
     * @param int $trab_id del empleado
     * @author Dawin Ossa
     * @return int 
     */
    public function sueldo($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_sueldo('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $sueldo = $row->sueldo;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $sueldo;
    }

    /**
     * calcula los dias restantes entre la fecha de ingreso y la de salida
     * @param int $trab_id del empleado
     * @author Dawin Ossa
     * @return int 
     */
    public function diasContrato($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_dias_contrato('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $dias = $row->dias;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $dias;
    }

    /**
     * calcula la indemnizacion de un empleado de acuerdo a su id
     * @see tipoContrato(), sueldo(), diasTrabajados(), diasContrato()
     * @param int $empleado id del empleado a indemnizar
     * @author Dawin Ossa
     * @return float 
     */
    public function indemnizacion($empleado) {
        $tcon = self::tipoContrato($empleado);
        $salary = self::sueldo($empleado);
        $sal_min = $this->_con->value('devengado', 'salario minimo');
        $dias = self::diasTrabajados($empleado);
        if ($salary <= ($sal_min * 10)) {
            if (($tcon == 'duracion de obra') or ($tcon == 'labor determinada')) {
                if ($dias < self::DIAS_ANIO) {
                    $dias_indemnizar = ((30 * $dias) / self::DIAS_ANIO);
                    $indemnizacion = (($salary / 30) * $dias_indemnizar);
                } else {
                    $dias_indemnizar = (self::DIAS_ANIO + ((20 * ($dias - self::DIAS_ANIO)) / self::DIAS_ANIO));
                    $indemnizacion = (($salary / 30) * $dias_indemnizar);
                }
            } elseif ($tcon = 'termino indefinido') {
                // Duracion del contrato
                $dias_contrato = $this->diasContrato($empleado);
                $indemnizacion = (($salary / 30) * ($dias_contrato - $dias));
            }
        }
        return number_format($indemnizacion);
    }

    public function totalhoras_diurnas($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_total_horas_diurnas('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $totalhoras_diurnas = $row->suma;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $totalhoras_diurnas;
    }

    public function totalhoras_nocturnas($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_total_horas_nocturnas('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $totalhoras_nocturnas = $row->suma;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $totalhoras_nocturnas;
    }

    public function totalhoras_diur_dominical($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_total_horas_diur_dominical('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $totalhoras_diur_dominical = $row->suma;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $totalhoras_diur_dominical;
    }

    public function totalhoras_noc_dominical($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_total_horas_noc_dominical('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $totalhoras_noc_dominical = $row->suma;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $totalhoras_noc_dominical;
    }

    public function totalhoras_diur_ext_dominical($trab_id) {
        try {
            $result = $this->_db->prepare("CALL sp_total_horas_diur_ext_dominical('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $totalhoras_diur_ext_dominical = $row->suma;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $totalhoras_diur_ext_dominical;
    }

    public function totalhoras_noc_ext_dominical($trab_id) {

        try {
            $result = $this->_db->prepare("CALL sp_total_horas_noc_ext_dominical('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $totalhoras_noc_ext_dominical = $row->suma;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $totalhoras_noc_ext_dominical;
    }

    public function insertpago($trab_id, $concepto, $valor, $fec, $tip, $est, $nomina) {
        try {
            $result = $this->_db->prepare("CALL sp_insertar_valores_nomina('{$trab_id}', '{$concepto}', '{$valor}', '{$fec}', '{$tip}', '{$est}', '{$nomina}')");
            return $result->execute();
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $totalhoras_noc_ext_dominical;
    }

    public function totaldevengado($empleado) {
        $salary = self::sueldo($empleado);
        /* calculado horas */
        $valor_hora = ($salary / 30 / 8);

        $valor_extra_diurna = $this->_con->value('devengado', 'hora extra diurna');
        $total_horas_diurnas = self::totalhoras_diurnas($empleado);
        $diurnas = ((((($valor_hora * $valor_extra_diurna ) / 100) * $total_horas_diurnas )) + ($valor_hora * $total_horas_diurnas));

        $valor_extra_nocturna = $this->_con->value('devengado', 'hora extra nocturna');
        $total_horas_nocturnas = self::totalhoras_nocturnas($empleado);
        $nocturnas = ((((($valor_hora * $valor_extra_nocturna) / 100) * $total_horas_nocturnas)) + ($valor_hora * $total_horas_nocturnas));

        $valor_hora_ordinaria_festivas = $this->_con->value('devengado', 'hora ordinaria festiva');
        $total_horas_diur_dominical = self::totalhoras_diur_dominical($empleado);
        $diurnas_dominical = ((((($valor_hora_ordinaria_festivas) / 100) * $total_horas_diur_dominical)) + ($valor_hora_ordinaria_festivas * $total_horas_diur_dominical));

        $total_horas_noc_dominical = self::totalhoras_noc_dominical($empleado);
        $nocturnas_dominical = ((((($valor_hora_ordinaria_festivas) / 100) * $total_horas_noc_dominical)) + ($valor_hora_ordinaria_festivas * $total_horas_noc_dominical));

        $valor_extra_diurna_dominical = $this->_con->value('devengado', 'hora extra diurna dominical');
        $total_horas_diur_ext_dominical = self::totalhoras_diur_ext_dominical($empleado);
        $ext_diurnas_dominical = ((((($valor_hora_ordinaria_festivas * $valor_extra_diurna_dominical) / 100) * $total_horas_diur_ext_dominical)) + ($valor_hora * $total_horas_diur_ext_dominical));

        $valor_extra_nocturna_dominical = $this->_con->value('devengado', 'hora extra nocturna dominical');
        $total_horas_noc_ext_dominical = self::totalhoras_noc_ext_dominical($empleado);
        $ext_nocturnas_dominical = ((((($valor_hora_ordinaria_festivas * $valor_extra_nocturna_dominical) / 100) * $total_horas_noc_dominical)) + ($valor_hora * $total_horas_noc_ext_dominical));

        $extras = ($diurnas + $nocturnas + $diurnas_dominical + $nocturnas_dominical + $ext_diurnas_dominical + $ext_nocturnas_dominical);
        $aux_trans = $this->_con->value('devengado', 'auxilio de transporte');
        /* total devengado */
        $total_devengado = ($salary + $aux_trans + $extras);
        return $total_devengado;
    }

    public function tthorasExtras($empleado) {

        $salary = self::sueldo($empleado);
        /* calculado horas */
        $valor_hora = ($salary / 30 / 8);

        $valor_extra_diurna = $this->_con->value('devengado', 'hora extra diurna');
        $total_horas_diurnas = self::totalhoras_diurnas($empleado);
        $diurnas = ((((($valor_hora * $valor_extra_diurna ) / 100) * $total_horas_diurnas )) + ($valor_hora * $total_horas_diurnas));

        $valor_extra_nocturna = $this->_con->value('devengado', 'hora extra nocturna');
        $total_horas_nocturnas = self::totalhoras_nocturnas($empleado);
        $nocturnas = ((((($valor_hora * $valor_extra_nocturna) / 100) * $total_horas_nocturnas)) + ($valor_hora * $total_horas_nocturnas));

        $valor_hora_ordinaria_festivas = $this->_con->value('devengado', 'hora ordinaria festiva');
        $total_horas_diur_dominical = self::totalhoras_diur_dominical($empleado);
        $diurnas_dominical = ((((($valor_hora_ordinaria_festivas) / 100) * $total_horas_diur_dominical)) + ($valor_hora_ordinaria_festivas * $total_horas_diur_dominical));

        $total_horas_noc_dominical = self::totalhoras_noc_dominical($empleado);
        $nocturnas_dominical = ((((($valor_hora_ordinaria_festivas) / 100) * $total_horas_noc_dominical)) + ($valor_hora_ordinaria_festivas * $total_horas_noc_dominical));

        $valor_extra_diurna_dominical = $this->_con->value('devengado', 'hora extra diurna dominical');
        $total_horas_diur_ext_dominical = self::totalhoras_diur_ext_dominical($empleado);
        $ext_diurnas_dominical = ((((($valor_hora_ordinaria_festivas * $valor_extra_diurna_dominical) / 100) * $total_horas_diur_ext_dominical)) + ($valor_hora * $total_horas_diur_ext_dominical));

        $valor_extra_nocturna_dominical = $this->_con->value('devengado', 'hora extra nocturna dominical');
        $total_horas_noc_ext_dominical = self::totalhoras_noc_ext_dominical($empleado);
        $ext_nocturnas_dominical = ((((($valor_hora_ordinaria_festivas * $valor_extra_nocturna_dominical) / 100) * $total_horas_noc_dominical)) + ($valor_hora * $total_horas_noc_ext_dominical));

        $extras = ($diurnas + $nocturnas + $diurnas_dominical + $nocturnas_dominical + $ext_diurnas_dominical + $ext_nocturnas_dominical);
        return self::format($extras);
    }

    private function format($number) {
        return number_format($number, 0, '.', '');
    }

    /* salud deduccion */

    public function Salud($empleado) {
        $total_devengado = self::totaldevengado($empleado);
        $salud = $this->_con->value('deduccion', 'salud');
        $total_Salud = (($total_devengado - self::auxilio($empleado) ) * ($salud / 100));
        return self::format($total_Salud);
    }

    /* pension deduccion */

    public function Pension($empleado) {
        $total_devengado = self::totaldevengado($empleado);
        $pension = $this->_con->value('deduccion', 'pension');
        $total_Pension = (($total_devengado - self::auxilio($empleado)) * ($pension / 100));
        return self::format($total_Pension);
    }

    public function auxilio($trab_id) {
        if ($this->sueldo($trab_id) <= ($this->_con->value('devengado', 'salario minimo') * 2))
            return $this->_con->value('devengado', 'auxilio de transporte');
        else
            return 0;
    }

    //Parafiscales
    public function viewparafiscales($nomina) {
        $parafiscal = $this->useModel('parafiscal');
        return $parafiscal->viewparafiscales($nomina);
    }

    /**
     * calcula el valor parafiscal Sena 2%
     * @param int $empleado id del empleado a indemnizar
     * @author Dawin Ossa
     * @return float 
     */
    public function sena($total_nomina) {
        return $this->format(($total_nomina - self::auxilio($empleado)) * $this->_con->value('parafiscal', 'sena') / 100);
    }

    /**
     * calcula el valor parafiscal icbf 2%
     * @param int $total_nomina valor total nomina
     * @author Dawin Ossa
     * @return float 
     */
    public function icbf($total_nomina) {
        return $this->format(($total_nomina - self::auxilio($empleado)) * $this->_con->value('parafiscal', 'icbf') / 100);
    }

    /**
     * calcula el valor parafiscal icbf 2%
     * @param int $total_nomina valor total nomina
     * @author Dawin Ossa
     * @return float 
     */
    public function ccf($total_nomina) {
        return $this->format(($total_nomina - self::auxilio($empleado)) * $this->_con->value('parafiscal', 'ccf') / 100);
    }

    /* PRESTACIONES seguridad social SOCIALES */

    public function Arp($empleado) {
        $total_devengado = self::totaldevengado($empleado);
        $Arp = $this->_con->value('apropiacion', 'arp');
        // $aux_trans=$this->_con->value('devengado', 'auxilio de transporte');
        $total_Arp = (($total_devengado - self::auxilio($empleado)) * ($Arp / 100));
        return self::format($total_Arp);
    }

    public function Salud_Prest($empleado) {
        $total_devengado = self::totaldevengado($empleado);
        $Salud_p = $this->_con->value('apropiacion', 'salud');
        $total_Salud_p = (($total_devengado - self::auxilio($empleado) ) * ($Salud_p / 100));
        return self::format($total_Salud_p);
    }

    /**
     * calcula la pension por parte del empleador de acuerdo a su id
     * @see totaldevengado()
     * @param int $empleado id del empleado a sacar pension
     * @author M. Camila Uribe
     * @return float 
     */
    public function Pension_Prest($empleado) {
        $total_devengado = self::totaldevengado($empleado);
        $Pension_p = $this->_con->value('apropiacion', 'pension');
        $total_Pension_p = (($total_devengado - self::auxilio($empleado)) * ($Pension_p / 100));
        return self::format($total_Pension_p);
    }

    /* PRESTACIONES SOCIALES */

    /**
     * calcula la cesantia de un empleado de acuerdo a su id
     * @see sueldo(), diasTrabajados()
     * @param int $empleado id del empleado a sacar cesantias
     * @author M. Camila Uribe
     * @return float 
     */
    public function Cesantias($empleado, $fi, $ff) {


        $salary = self::sueldo($empleado);
        $dias = self::diasTrabajados($empleado, $fi, $ff);
        $cesantias = (($salary * $dias) / 360);

        return self::format($cesantias);
    }

    /**
     * calcula la prima de un empleado de acuerdo a su id
     * @see sueldo(), diasTrabajados()
     * @param int $empleado id del empleado a sacar prima
     * @author M. Camila Uribe
     * @return float 
     */
    public function Prima($empleado) {


        $salary = self::sueldo($empleado);
        $dias = self::diasTrabajados($empleado, $fi, $ff);
        $prima = (($salary * $dias) / 360);

        return self::format($prima);
    }

    /**
     * calcula Intereses sobre las cesantías de un empleado de acuerdo a su id
     * @see cesantias(), diasTrabajados()
     * @param int $empleado id del empleado a sacar los interes sobre las cesantias
     * @author M. Camila Uribe
     * @return float 
     */
    public function Interes_Cesantias($empleado) {

        $cesantias = self::Cesantias($empleado);
        $dias = self::diasTrabajados($empleado);
        $interes = $this->_con->value('apropiacion', 'interes_cesantia');
        $interes_cesantias = (($cesantias * $dias * ($interes / 100)) / 360);
        return self::format($interes_cesantias);
    }

    /**
     * calcula vacaciones de un empleado de acuerdo a su id
     * @see sueldo(), diasTrabajados()
     * @param int $empleado id del empleado a sacar vacaciones
     * @return float 
     * @author M. Camila Uribe
     */
    public function Vacaciones($empleado) {
        $salary = self::sueldo($empleado);
        $dias = self::diasTrabajados($empleado);
        $vacaciones = (($salary * $dias) / 720);
        return self::format($vacaciones);
    }

    /**
     * calcula la comision del empleado
     * @param int $trab_id del empleado
     * @author M. Camila Uribe
     * @return int 
     */
    public function Vcomision($trab_id) {

        try {
            $result = $this->_db->prepare("CALL sp_comision('{$trab_id}')");
            $result->execute();
            if ($row = $result->fetch(\PDO::FETCH_OBJ)) {
                $comision = $row->comision;
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return $comision;
    }

    /**
     * calcula la comision de un empleado de acuerdo a su id
     * @param int $empleado id del empleado a sacar comision 
     * @return float 
     */
    public function viewComissionPeriod($emp, $f1, $f2) {
        try {
            $result = $this->_db->prepare("CALL sp_view_comission_period('{$emp}', '{$f1}', '{$f2}')");
            $result->execute();
            while ($row = $result->fetch(\PDO::FETCH_ASSOC)) {
                $data[] = $row['valor'];
            }
        } catch (\PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
        return array_sum($data);
    }

}
